<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    


    <script>
        //作用域  代码变量  可以使用的范围  他可以提高代码可靠性  也可以减少命名冲突
        // 全局作用域  整个 script  在任意未知都能访问到
        // 局部作用域  比如只能在函数内部使用

        function demo() {
            // 使用变量  因为 在局部作用域中  既可以访问全局也可以访问局部 这里秉持就近原则，谁里使用者近  就用哪一个 一般为有局部先用局部的 没有局部变量  再找全局的
            let a = 100;//局部变量
            console.log(a);
            b=100;
            //如果不声明变量  直接给变量赋值  默认视为全局变量  不管你在函数里还是函数外
            //注意   不提倡这种
        }
        //函数里面定义的变量外界无法访问
        // console.log(a);
        demo()  

        
        // let 和 var 的区别
        //let  有块级作用域  var没有块级作用域
        //let 没有变量提升   var有变量提升
        //块作用域  {}  就是块
        if(!0){
            var a = 100;
        }
        console.log(a);
        //let 不能重复声明  var 可以  会被直接覆盖

        //变量提升
        //js 运行代码时  会先进行一波解析（预解析）  会将js代码中所有 用var  声明的变量 或者 函数的声明 进行提升（提升执行顺序）    提升结束后的代码才会开始执行
        //这种提升变量的特点 叫做变量提升



        


    </script>
</body>
</html>